#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
智能化漏洞检测与攻击路径分析平台 - 最终执行和指南

此脚本提供完整的项目说明、运行指南以及一键启动功能。
"""

import os
import sys
import subprocess
import time
import json
from datetime import datetime

# 项目根目录
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

# 服务配置
SERVICES = {
    "Flask API": "http://127.0.0.1:5000",
    "Celery Worker": "后台任务队列",
    "Redis Server": "本地Redis服务",
    "Streamlit前端": "http://localhost:8501",
    "Vue 3前端": "http://localhost:8080"
}

# 关键端点
ENDPOINTS = {
    "健康检查": "/health",
    "API文档": "/api/docs",
    "扫描接口": "/api/v1/scan",
    "报告接口": "/api/v1/reports"
}


def print_with_color(text, color_code=37):
    """打印带颜色的文本"""
    try:
        print(f"\033[{color_code}m{text}\033[0m")
    except:
        print(text)  # 降级处理


def print_title(text):
    """打印标题（黄色粗体）"""
    print_with_color(f"\n{text}", 33)
    print_with_color("=" * len(text), 33)


def print_success(text):
    """打印成功信息（绿色）"""
    print_with_color(text, 32)


def print_error(text):
    """打印错误信息（红色）"""
    print_with_color(text, 31)


def print_info(text):
    """打印信息（蓝色）"""
    print_with_color(text, 34)


def print_warning(text):
    """打印警告信息（黄色）"""
    print_with_color(text, 33)


def run_command(command, cwd=None, shell=True, timeout=None):
    """运行命令并返回结果"""
    if cwd is None:
        cwd = PROJECT_ROOT
    
    print_info(f"执行: {command}")
    try:
        result = subprocess.run(
            command,
            cwd=cwd,
            shell=shell,
            timeout=timeout,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        
        # 尝试解码输出
        stdout = ""
        stderr = ""
        try:
            stdout = result.stdout.decode('utf-8', errors='replace').strip()
            stderr = result.stderr.decode('utf-8', errors='replace').strip()
        except:
            try:
                stdout = result.stdout.decode('gbk', errors='replace').strip()
                stderr = result.stderr.decode('gbk', errors='replace').strip()
            except:
                stdout = str(result.stdout[:500]) + "..." if len(result.stdout) > 500 else str(result.stdout)
                stderr = str(result.stderr[:500]) + "..." if len(result.stderr) > 500 else str(result.stderr)
        
        return result.returncode, stdout, stderr
    except Exception as e:
        return -1, "", str(e)


def check_python_environment():
    """检查Python环境"""
    print_title("检查Python环境")
    code, output, _ = run_command("python --version")
    if code == 0:
        print_success(f"Python版本: {output}")
        return True
    else:
        print_error("错误: 未找到Python或Python不在PATH中")
        return False


def install_dependencies():
    """安装依赖项"""
    print_title("安装项目依赖")
    requirements_file = os.path.join(PROJECT_ROOT, "requirements.txt")
    
    if os.path.exists(requirements_file):
        print_info(f"使用requirements.txt安装依赖: {requirements_file}")
        code, output, error = run_command("pip install -r requirements.txt")
        if code == 0:
            print_success("依赖安装成功")
            return True
        else:
            print_error("依赖安装失败")
            print_warning(f"错误信息: {error}")
            return False
    else:
        print_error("错误: requirements.txt文件不存在")
        return False


def start_services():
    """启动所有服务"""
    print_title("启动项目服务")
    print_info("正在运行start.py脚本启动所有服务...")
    
    # 使用新终端启动start.py，因为它会启动多个长时间运行的服务
    try:
        # 在Windows上使用start命令打开新窗口
        print_info("正在打开新窗口启动服务...")
        subprocess.Popen(
            "start cmd /k python start.py",
            cwd=PROJECT_ROOT,
            shell=True
        )
        print_success("服务启动脚本已在新窗口中运行")
        print_info("请在新窗口中查看服务启动状态")
        return True
    except Exception as e:
        print_error(f"启动服务失败: {str(e)}")
        return False


def create_gitee_push_guide():
    """创建Gitee推送指南"""
    guide = """
# Gitee仓库推送指南

## 准备工作
1. 确保已安装Git: https://git-scm.com/downloads
2. 在Gitee上注册账号: https://gitee.com

## 推送步骤

### 1. 创建Gitee仓库
- 登录Gitee
- 点击右上角的 '+' -> '新建仓库'
- 填写仓库信息:
  - 仓库名称: vulnerability-scanner
  - 路径: vulnerability-scanner
  - 仓库介绍: 智能化漏洞检测与攻击路径分析平台
  - 选择公开或私有
  - **不要勾选** 使用README文件初始化仓库
  - 点击创建仓库

### 2. 配置本地Git（命令行操作）
打开命令提示符或PowerShell，导航到项目目录:

```bash
cd d:\未知\vulnerability_scanner

# 配置Git用户信息
git config user.name "您的Gitee用户名"
git config user.email "您的邮箱地址"

# 初始化仓库（如果还没有.git目录）
git init

# 确保.gitignore文件存在（已创建）

# 添加所有文件
git add .

# 提交更改
git commit -m "初始化项目"

# 添加远程仓库（替换为您的用户名）
git remote add origin https://gitee.com/您的用户名/vulnerability-scanner.git

# 推送代码
git push -u origin master
```

### 3. 推送注意事项
- 推送时会提示输入Gitee账号密码
- 如果遇到权限问题，请检查Gitee仓库权限设置
- 如果遇到推送冲突，可以使用 `git pull --rebase origin master` 先拉取最新代码

## 验证推送
推送成功后，可以在Gitee仓库页面查看:
https://gitee.com/您的用户名/vulnerability-scanner
"""
    
    guide_path = os.path.join(PROJECT_ROOT, "Gitee推送详细指南.md")
    with open(guide_path, "w", encoding="utf-8") as f:
        f.write(guide)
    
    print_success(f"Gitee推送详细指南已保存到: {guide_path}")
    return guide_path


def create_project_summary():
    """创建项目总结文档"""
    summary = """
# 智能化漏洞检测与攻击路径分析平台 - 项目总结

## 项目概述

本项目是一个综合性的漏洞检测与攻击路径分析平台，具备以下核心功能：

- **智能漏洞扫描**: 支持多种常见漏洞类型的自动检测
- **攻击路径分析**: 分析系统中的安全漏洞，识别潜在的攻击路径
- **多模块架构**: Flask后端 + Celery任务队列 + Redis缓存 + 双前端（Vue 3 + Streamlit）
- **完整API系统**: 提供RESTful API接口，支持第三方集成
- **实时扫描报告**: 生成详细的漏洞扫描报告和修复建议

## 技术架构

### 后端架构
- **Flask**: Web框架，提供API接口和业务逻辑处理
- **Celery**: 分布式任务队列，处理耗时的扫描任务
- **Redis**: 缓存系统，存储任务状态和临时数据
- **SQLite**: 轻量级数据库，存储扫描历史和结果

### 前端架构
- **Vue 3**: 现代化的企业级前端框架，提供主界面
- **Streamlit**: 快速开发的数据可视化界面，提供分析报告

### 核心模块
- `app/`: Flask应用主目录
- `celery_tasks/`: Celery任务定义
- `core/`: 核心业务逻辑
- `scanners/`: 各类漏洞扫描器实现
- `frontend/`: Vue 3前端代码
- `streamlit_app/`: Streamlit应用代码

## 系统运行说明

### 快速启动
```bash
# 一键启动所有服务
python start.py
```

### 服务地址
- **Flask API**: http://127.0.0.1:5000
- **Streamlit前端**: http://localhost:8501
- **Vue 3前端**: http://localhost:8080

### 主要接口
- **健康检查**: GET http://127.0.0.1:5000/health
- **API文档**: http://127.0.0.1:5000/api/docs
- **扫描接口**: POST http://127.0.0.1:5000/api/v1/scan
- **报告接口**: GET http://127.0.0.1:5000/api/v1/reports

## 项目文件结构

```
vulnerability_scanner/
├── app/                 # Flask应用主目录
├── celery_tasks/        # Celery任务定义
├── core/                # 核心业务逻辑
├── scanners/            # 漏洞扫描器实现
├── frontend/            # Vue 3前端代码
├── streamlit_app/       # Streamlit应用
├── tests/               # 测试用例
├── start.py             # 主启动脚本
├── check_and_run.py     # 系统检查脚本
├── requirements.txt     # 依赖配置
├── README.md            # 项目说明文档
└── vulnerability.db     # SQLite数据库
```

## 安全特性

- **输入验证**: 所有用户输入都经过严格验证
- **速率限制**: 防止API滥用
- **错误处理**: 统一的错误处理机制，不泄露敏感信息
- **日志记录**: 详细的操作日志，便于审计
- **扫描安全**: 扫描过程安全可控，不会对目标系统造成损害

## 后续开发建议

1. **添加更多漏洞扫描器**: 扩展支持的漏洞类型
2. **增强分析能力**: 添加机器学习模型提升漏洞检测准确率
3. **完善权限系统**: 添加用户认证和权限控制
4. **优化性能**: 提升大规模扫描的性能表现
5. **集成更多数据源**: 支持与其他安全工具的集成

## 常见问题解答

**Q: Redis服务无法启动怎么办？**
A: 脚本会自动检查并尝试启动Redis，如果失败，请手动安装Redis并启动服务。

**Q: 如何添加新的漏洞扫描器？**
A: 在scanners目录下创建新的扫描器类，继承BaseScanner基类。

**Q: 扫描结果保存在哪里？**
A: 扫描结果保存在SQLite数据库中，同时可以通过API导出为JSON格式。

**Q: 如何进行系统测试？**
A: 可以使用tests目录下的测试脚本，或直接使用check_and_run.py进行系统检查。
"""
    
    summary_path = os.path.join(PROJECT_ROOT, "项目总结与使用说明.md")
    with open(summary_path, "w", encoding="utf-8") as f:
        f.write(summary)
    
    print_success(f"项目总结文档已保存到: {summary_path}")
    return summary_path


def main():
    """主函数"""
    print("\n" + "="*60)
    print_with_color("    智能化漏洞检测与攻击路径分析平台", 33)
    print_with_color("          最终运行与部署指南", 33)
    print("="*60)
    
    # 1. 显示项目信息
    print_title("项目信息概览")
    print_info("项目名称: 智能化漏洞检测与攻击路径分析平台")
    print_info(f"当前目录: {PROJECT_ROOT}")
    print_info(f"执行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    
    # 2. 检查Python环境
    if not check_python_environment():
        print_error("无法继续，请先安装Python")
        return 1
    
    # 3. 安装依赖
    print("\n是否安装/更新项目依赖？(y/n): ")
    choice = input().strip().lower()
    if choice == 'y':
        if not install_dependencies():
            print_warning("依赖安装失败，将继续尝试其他操作")
    
    # 4. 创建文档
    print_title("生成项目文档")
    guide_path = create_gitee_push_guide()
    summary_path = create_project_summary()
    
    # 5. 显示服务信息
    print_title("服务配置信息")
    for name, url in SERVICES.items():
        print_info(f"{name}: {url}")
    
    print_title("关键API端点")
    for name, endpoint in ENDPOINTS.items():
        print_info(f"{name}: {SERVICES['Flask API']}{endpoint}")
    
    # 6. 启动服务
    print("\n是否启动项目服务？(y/n): ")
    choice = input().strip().lower()
    if choice == 'y':
        start_services()
    
    # 7. 总结
    print_title("操作完成")
    print_success("项目文档已生成完毕")
    print_success(f"Gitee推送指南: {guide_path}")
    print_success(f"项目总结文档: {summary_path}")
    print("\n" + "="*60)
    print_with_color("    感谢使用智能化漏洞检测与攻击路径分析平台", 32)
    print_with_color("    祝您使用愉快！", 32)
    print("="*60)
    
    return 0


if __name__ == "__main__":
    try:
        exit_code = main()
    except KeyboardInterrupt:
        print_error("\n操作被用户中断")
        exit_code = 1
    except Exception as e:
        print_error(f"\n发生异常: {str(e)}")
        exit_code = 1
    
    input("\n按Enter键退出...")
    sys.exit(exit_code)